//
// Created by denglibin on 19-10-21.
//

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>

/**
 * 打印信号集
 * int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);

   其中参数 how可设置的参数为：SIG_BLOCK， SIG_UNBLOCK，SIG_SETMASK

   SIG_BLOCK：
        按照参数  set 提供的屏蔽字，屏蔽信号。并将原信号屏蔽保存到oldset中。

   SIG_UNBLOCK：
     按照参数  set 提供的屏蔽字进行信号的解除屏蔽。针对Set中的信号进行解屏。

   SIG_SETMASK:
     按照参数  set 提供的信号设置重新设置系统信号设置。
 * @param pset
 */
static void printsigset(const sigset_t *pset)
{
    int i = 0;
    //遍历64个信号，
    for (; i < 64; i++)
    {
        //信号从1开始   判断哪些信号在信号未决状态字中
        if (sigismember(pset, i + 1))
            putchar('1');
        else
            putchar('0');
    }
    printf("\n");
}


static int main_(int argc, char * argv[]){

    // 定义未决信号集(pending)
    sigset_t pset;
    // 定义阻塞信号集(block)
    sigset_t bset;
    // 清空信号集
    sigemptyset(&bset);
    // 将信号GIGINT加入到信号集中
    sigaddset(&bset, SIGINT);
    //进行位或操作，将信号集bset更新到进程控制块PCB结构中，阻塞信号SIGINT（即使用户按下ctrl+c，信号也不会递达）
    sigprocmask(SIG_BLOCK, &bset, NULL);

    while(1){
        /*
         * 获取当前信号未决信息，即使在sigprocmask()函数中设置了信号阻塞，
         * 但是如果没有信号的到来，信号未决状态字对应位依然是0
         * 只要有信号到来，并且被阻塞了，信号未决状态字对应位才会是1
         **/
        sigpending(&pset);
        // 打印信号未决信息
        printsigset(&pset);
        sleep(2);

    }

    return 0;
}